/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.helpdesk.ejb;

import app.bean.Cifrado;
import com.helpdesk.controlador.HdUsuariosController;
import com.helpdesk.controlador.util.JsfUtil;
import com.helpdesk.entidades.HdUsuarios;
import com.helpdesk.entidades.HdRoles;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.constraints.Future.List;
/**
 *
 * @author Miguel
 */
@ManagedBean(name="login_bean")
@SessionScoped

public class login_bean {
	    private String username;
	    private String password;
	    private String dbusername;
            //modificado
            private String nombre;
            private String apellidos;
            private Integer userid;
            private Integer rolid;
            
	 
            public Integer getRolid() {
        return rolid;
    }

    public void setRolid(Integer rolid) {
        this.rolid = rolid;
    }

    public Integer getUserid() {
        return userid;
    }

    public void setUserid(Integer userid) {
        this.userid = userid;
    }
//modificado
	    public String getDbpassword() {
	        return dbpassword;
	    }
	    public String getDbusername() {
	        return dbusername;
	    }
	 
	    private String dbpassword;

    @PersistenceContext(unitName = "WebAppHelpDeskPU")
    private EntityManager em;

    protected EntityManager getEntityManager() 
    {
        return em;
    }
	    public void dbData(String UName)
	    {
	        try
	        {
                   
        Query q =(Query) em.createNamedQuery("HdUsuarios.findByNickUsuario",HdUsuarios.class);  
        q.setParameter("nickUsuario", UName);
        HdUsuarios user = (HdUsuarios) q.getSingleResult();
        
        dbusername=user.getNickUsuario().toString();
	dbpassword=user.getPassUsuario().toString();
        //modificado
        nombre=user.getNomUsuario().toString();
        apellidos=user.getApeUsuarios().toString();
        userid=Integer.parseInt(user.getCodUsuario().toString());
        rolid=Integer.parseInt(user.getCodRol().getCodRol().toString());
        //modificado
                }
	        catch(Exception ex)
	        {
	            ex.printStackTrace();
	            System.out.println("Exception Occur :" + ex);
	        }
	    }
	    public String getPassword() {
	        return password;
	    }
	 
	    public void setPassword(String password) {
	        this.password = password;
	    }
	 
	    public String getUsername() {
	        return username;
	    }
 
	    public void setUsername(String username) {
	        this.username = username;
	    }
	    public String checkValidUser() throws UnsupportedEncodingException, NoSuchAlgorithmException
	    {
	        dbData(username);
	 
	        if(username.equalsIgnoreCase(dbusername))
	        {
	            //if(password.equals(dbpassword))
                    //No logro invocar al método privado "cifrarPassword" en el controlador
	            //if(cifrarPassword(password).equals(dbpassword))
                    //Accesando directamente a la clase Cifrado
                    if(Cifrado.SHA1(password).equals(dbpassword))
                    {
                       
                        FacesContext context = FacesContext.getCurrentInstance();
                        
                        context.getExternalContext().getSessionMap().put("UserFirstName", nombre);
                        context.getExternalContext().getSessionMap().put("UserLastName", apellidos);
                        context.getExternalContext().getSessionMap().put("UserID", userid);
                        context.getExternalContext().getSessionMap().put("UserRolID", rolid);

                       return "valid";
                    }
	            else
	            {
	                return "invalid";
	            }
	        }
	        else
	        {
	            return "invalid";
	        }
	    }

private HdUsuarios usuarioValidado;

public HdUsuarios getUsuarioValidado()
{
// Recuperamos el usuario de sesión.

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession)context.getSession(true);
            
if(session.getAttribute("usuarioLogin") == null)
{
usuarioValidado = new HdUsuarios();
}
else   
usuarioValidado = (HdUsuarios)session.getAttribute("usuarioLogin");
return usuarioValidado;
}

            /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    /**
     * @return the nombre
     */
    public String getApellidos() {
        return apellidos;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    //public void SessionLogout()
    //{
    //FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    
    //FacesContext context = FacesContext.getCurrentInstance();
    
    //context.getExternalContext().getSessionMap().remove("UserFirstName");
        
    //FacesContext context = FacesContext.getCurrentInstance();

    //ExternalContext externalContext = context.getExternalContext();

    //Object session = externalContext.getSession(false);

    //HttpSession httpSession = (HttpSession) session;

    //httpSession.invalidate();
        
        //ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
        //String ctxPath = ((ServletContext) ctx.getContext()).getContextPath();

 // try {
    // Usar el contexto de JSF para invalidar la sesión,
    // NO EL DE SERVLETS (nada de HttpServletRequest)
    //((HttpSession) ctx.getSession(false)).invalidate();

    // Redirección de nuevo con el contexto de JSF,
    // si se usa una HttpServletResponse fallará.
    // Sin embargo, como ya está fuera del ciclo de vida 
    // de JSF se debe usar la ruta completa -_-U
    //ctx.redirect(ctxPath + "/faces/frmlogin.xhtml");
      
    //FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    
 // } catch (IOException ex) {
 //   ex.printStackTrace();
 // }

    //}
    
    public void logout(){
         ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
         HttpSession session = (HttpSession) externalContext.getSession(false);
         
         externalContext.getSessionMap().remove("UserFirstName");
         externalContext.getSessionMap().remove("UserLastName");
         externalContext.getSessionMap().remove("UserID");
         externalContext.getSessionMap().remove("UserRolID");
         //session.invalidate();
         try {
             externalContext.redirect("faces/frmlogin.xhtml");
         } catch (IOException e) {
             JsfUtil.addErrorMessage("Fallo en redirección a pagina de inicio.");
         }
 	}
	}
